Tipos de gráficos ----------------- .. code:: r library(ggplot2) .. code:: r datos = read.csv("Ofertas laborales.csv", sep = ";", dec = ",", header = T) print(head(datos)) .. parsed-literal:: cargo vacantes salario_honorarios sexo 1 contador 3 2200000 indiferente 2 contador 1 2500000 indiferente 3 contador 1 2000000 indiferente 4 analista de mercados 3 1500000 indiferente 5 coodinador de planeacion 1 2200000 indiferente 6 administradora 1 1500000 femenino nivel_educativo años_experiencia idiomas 1 profesional 5.00 no dato 2 profesional 2.00 no dato 3 profesional 2.00 no dato 4 profesional 1.00 no dato 5 profesional 0.25 no dato 6 profesional 1.00 no dato .. code:: r str(datos) .. parsed-literal:: 'data.frame': 86 obs. of 7 variables: $ cargo : Factor w/ 44 levels "administración de compras ",..: 21 21 21 9 23 5 17 6 7 38 ... $ vacantes : int 3 1 1 3 1 1 1 1 1 1 ... $ salario_honorarios: int 2200000 2500000 2000000 1500000 2200000 1500000 1500000 2000000 2000000 1500000 ... $ sexo : Factor w/ 3 levels "femenino","indiferente",..: 2 2 2 2 2 1 1 2 2 3 ... $ nivel_educativo : Factor w/ 2 levels "especialización",..: 2 2 2 2 2 2 2 2 2 2 ... $ años_experiencia : num 5 2 2 1 0.25 1 0.5 2 2 3 ... $ idiomas : Factor w/ 2 levels "inglés","no dato": 2 2 2 2 2 2 2 2 2 2 ... Barras: ~~~~~~~ Las variables categóricas en ``R`` tienen el formato de ``Factor``. Estas variables permiten clasificar los datos asociando una etiqueta a cada dato. El gráfico de barras calcula la frecuencia relativa de cada variable categórica. Podemos identificar los factores de mayor y menor frecuencia. Se analiza cómo están los datos clasificando en función de una variable, por ejemplo, ¿existen mayores ofertas laborales para los especialistas? En ``ggplot2``\ se utiliza la capa ``geom_bar()`` **Una variable categórica:** .. code:: r ggplot(data = datos) + geom_bar(aes(x = nivel_educativo)) .. image:: output_9_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos) + geom_bar(aes(x = cargo)) + coord_flip() # Para girar el gráfico .. image:: output_10_0.png :width: 420px :height: 420px Para cambiar el color de cada barra (cada factor), se agrega ``fill = nivel_educativo`` dentro de ``aes()``. Las etiquetas del eje :math:`X` se cambian con ``scale_x_discrete(labels = c("Especialización", "Profesional"))`` .. code:: r ggplot(data = datos) + geom_bar(aes(x = nivel_educativo, fill = nivel_educativo), width = 0.3) + labs(title = "Ofertar laborales", subtitle = "Clasificación por nivel educativo", x = "Nivel educativo", y = "Cantidad", fill = "Nivel educativo") + scale_x_discrete(labels = c("Especialización", "Profesional")) .. image:: output_12_0.png :width: 420px :height: 420px **Más de una variable categórica:** El anterior gráfico clasifica los datos en una sola variable categórica haciendo que la clasificación por ``fill =`` se hiciera con la misma variable ``x =``, para clasificar dos variables categóricas, en estos dos argumentos se debe poner variables distintas, por ejemplo, ``x = nivel_educativo`` y en ``fill = sexo``. .. code:: r ggplot(data = datos) + geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) + labs(title = "Ofertar laborales", subtitle = "Clasificación por nivel educativo y sexo", x = "Nivel educativo", y = "Cantidad", fill = "Sexo") + scale_x_discrete(labels = c("Especialización", "Profesional")) .. image:: output_15_0.png :width: 420px :height: 420px Para clasificar con una tercera variable se puede agregar ``facet_grid ()`` .. code:: r ggplot(data = datos) + geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) + facet_grid(. ~ idiomas) + labs(title = "Ofertar laborales", subtitle = "Clasificación por nivel educativo, sexo e idioma", x = "Nivel educativo", y = "Cantidad", fill = "Sexo") + scale_x_discrete(labels = c("Especialización", "Profesional")) .. image:: output_17_0.png :width: 420px :height: 420px Note que aparecen unos colores por defecto, pero podemos crear nuestra propia paleta de colores e ingresarlos manualmente. Cuando clasificamos los datos por colores podemos cambiar los colores que la librería muestra por defecto. Primero, se crea una variable con los colores: ``colores <- c("steelblue1", "turquoise", "wheat")``. Luego, se agregan en el gráfico como una capa adicional así: ``+ scale_color_manual(values = colores, aesthetics = "fill")`` En este ejemplo la clasificación se está haciendo cambiando los colores en ``fill``, por esto se pone ``aesthetics = "fill"``, pero si la clasificación se hiciera por ``color``, entonces se pone ``aesthetics = "colour"`` .. code:: r colores <- c("steelblue1", "turquoise", "wheat") .. code:: r ggplot(data = datos) + geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) + facet_grid(. ~ idiomas) + labs(title = "Ofertar laborales", subtitle = "Clasificación por nivel educativo, sexo e idioma", x = "Nivel educativo", y = "Cantidad", fill = "Sexo") + scale_x_discrete(labels = c("Especialización", "Profesional")) + scale_color_manual(values = colores, aesthetics = "fill") .. image:: output_20_0.png :width: 420px :height: 420px Torta (pie): ~~~~~~~~~~~~ Primero se debe hacer un gráfico de barras, pero todas las barras apiladas en una sola, luego se transforma el gráfico con ``coord_polar()`` para cambiar las alturas de las barras por ángulos. El gráfico de barras apiladas se hace solo pasando una variable en :math:`y` y se deja la :math:`X` vacía así: ``x = "", y = nivel_educativo``. Se agrega ``stat = "identity"`` para que no se realice un conteo para la altura de las barras porque ya se especificó con ``y = nivel_educativo`` .. code:: r ggplot(data = datos) + aes(x = "", y = nivel_educativo, fill = nivel_educativo) + geom_bar(stat = "identity", width = 0.3) .. image:: output_23_0.png :width: 420px :height: 420px Después, el gráfico de torta o pie se hace transformando el gráfico anterior con ``coord_polar(theta = "y")``. ``theta = "y"`` es para cambiar la geometría de la altura de las barras. .. code:: r ggplot(data = datos) + aes(x = "", y = nivel_educativo, fill = nivel_educativo) + geom_bar(stat = "identity") + coord_polar(theta = "y") .. image:: output_25_0.png :width: 420px :height: 420px Histograma: ~~~~~~~~~~~ Se usa para variables numéricas. **Una variable:** .. code:: r ggplot(data = datos, aes(x = años_experiencia)) + geom_histogram(bins = 15, fill = "steelblue1", color = "black") + labs(title = "Ofertas laborales", subtitle = "Años de experiencia", x = "Años de experiencie", y = "Cantidad") .. image:: output_29_0.png :width: 420px :height: 420px **Clasificación con una variable:** Clasificación por años de experiencia y por sexo. Solo es agregar la clasificación dentro de ``aes()`` ya sea con ``color``, ``fill`` o ``shape``. .. code:: r colores <- c("steelblue1", "turquoise", "wheat") .. code:: r ggplot(data = datos, aes(x = años_experiencia, fill = sexo)) + geom_histogram(bins = 15, color = "black") + labs(title = "Ofertas laborales", subtitle = "Años de experiencia por sexo", x = "Años de experiencie", y = "Cantidad") + scale_color_manual(values = colores, aesthetics = "fill") .. image:: output_33_0.png :width: 420px :height: 420px **Clasificación con dos o más variables:** La segunda variable categórica que clasifica se agrega con ``facet_grid()`` .. code:: r ggplot(data = datos, aes(x = años_experiencia, fill = sexo)) + geom_histogram(bins = 15, color = "black") + facet_grid(. ~ idiomas) + labs(title = "Ofertas laborales", subtitle = "Años de experiencia por sexo e idiomas", x = "Años de experiencie", y = "Cantidad") + scale_color_manual(values = colores, aesthetics = "fill") .. image:: output_36_0.png :width: 420px :height: 420px Para una tercera variable para clasificar se llena el otro campo de ``facet_grid()``. .. code:: r ggplot(data = datos, aes(x = años_experiencia, fill = sexo)) + geom_histogram(bins = 15, color = "black") + facet_grid(vacantes ~ idiomas) + labs(title = "Ofertas laborales", subtitle = "Años de experiencia", x = "Años de experiencie", y = "Cantidad") + scale_color_manual(values = colores, aesthetics = "fill") .. image:: output_38_0.png :width: 420px :height: 420px Dispersión: ~~~~~~~~~~~ Los gráficos de dispersión son bivariados, se necesita una :math:`X` y una :math:`y`. .. code:: r ggplot(data = datos, aes(x = sexo, y = salario_honorarios)) + geom_point(size = 4) .. image:: output_41_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = sexo, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y sexo", x = "Sexo", y = "Salario") .. image:: output_42_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo", x = "Sexo", y = "Salario", color = "Nivel educativo") .. image:: output_43_0.png :width: 420px :height: 420px Las observaciones se pueden clasificar en el gráfico indicando las variables en ``aes()`` en los argumentos ``color``, ``fill``, ``size`` o ``shape``. Adiciomalmente, si se usa ``facet_grid()`` se puede hacer clasificaciones con una o dos variables adicionales. .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios, color = sexo)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo por sexo", x = "Nivel educativo", y = "Salario", color = "Sexo") .. image:: output_45_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios, color = sexo, shape = idiomas)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo por sexo e idiomas", x = "Nivel educativo", y = "Salario", color = "Sexo", shape = "Idiomas") .. image:: output_46_0.png :width: 420px :height: 420px La clasificación anterior por sexo e idiomas se puede hacer de la siguiente manera: .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios, color = sexo)) + geom_point(size = 4) + facet_grid(. ~ idiomas) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo por sexo e idiomas", x = "Nivel educativo", y = "Salario", color = "Sexo") .. image:: output_48_0.png :width: 420px :height: 420px Salario y años de experiencia por sexo. .. code:: r ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios, color = sexo)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia por sexo", x = "Años de experiencia", y = "Salario", color = "Sexo") .. image:: output_50_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios, color = sexo, shape = idiomas)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia por sexo", x = "Años de experiencia", y = "Salario", color = "Sexo") .. image:: output_51_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios, color = idiomas)) + geom_point(size = 4) + facet_grid(sexo ~ .) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia por sexo e idiomas", x = "Años de experiencia", y = "Salario", color = "Idiomas") .. image:: output_52_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios, color = idiomas)) + geom_point(size = 4) + facet_grid(sexo ~ vacantes) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia por sexo, idiomas y vacantes", x = "Años de experiencia", y = "Salario", color = "Idiomas") .. image:: output_53_0.png :width: 420px :height: 420px A veces a útil crear un gráfico de dispersión y al mismo tiempo mostrar la forma de los datos con histogramas, boxplots o densidades. Para hacer esto se usará el siguiente paquete: ``install.packages("ggExtra")`` .. code:: r library(ggExtra) Con la función ``ggMarginal()`` de la librería ``ggExtra`` podemos agregar gráficos “marginales” como histogramas, boxplots, etc. sobre los gráficos de ``ggplot2``. Primero se crea el gráfico con ``ggplot2``, pero se almacena en una variable, por ejemplo, en ``p``, luego se usa la función ``ggMarginal()`` indicando en el primer argumento el gráfico de ``ggplot2`` que lo llamamos ``p`` y en el segundo argumento el tipo de gráfico entre comillas. .. code:: r p <- ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia", x = "Años de experiencia", y = "Salario") ggMarginal(p, type = "histogram") .. image:: output_58_0.png :width: 420px :height: 420px .. code:: r p <- ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia", x = "Años de experiencia", y = "Salario") ggMarginal(p, type = "boxplot") .. image:: output_59_0.png :width: 420px :height: 420px .. code:: r p <- ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia", x = "Años de experiencia", y = "Salario") ggMarginal(p, type = "density") .. image:: output_60_0.png :width: 420px :height: 420px Gráfico marginal solo para la :math:`X`: ``margins = "x"``. .. code:: r p <- ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia", x = "Años de experiencia", y = "Salario") ggMarginal(p, margins = "x", type = "histogram", fill = "darkred") .. image:: output_62_0.png :width: 420px :height: 420px Gráfico marginal solo para la :math:`y`: ``margins = "y"``. .. code:: r p <- ggplot(data = datos, aes(x = años_experiencia, y = salario_honorarios)) + geom_point(size = 4) + labs(title = "Ofertas laborales", subtitle = "Salario y años de experiencia", x = "Años de experiencia", y = "Salario") ggMarginal(p, margins = "y", type = "histogram", fill = "darkred") .. image:: output_64_0.png :width: 420px :height: 420px Boxplot (diagrama de caja y bigotes): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Útiles para analizar los datos e identificar datos atípicos ( *outliers* ). .. figure:: Boxplot.png :alt: Boxplot Boxplot .. figure:: Diagrama_de_caja.jpg :alt: Diagrama Diagrama .. figure:: Box-Plot-Normal.PNG :alt: Boxplot-Nomal Boxplot-Nomal Distribución de los años de experiencia por cada sexo. .. code:: r ggplot(data = datos, aes(x = sexo, y = años_experiencia)) + geom_boxplot() .. image:: output_71_0.png :width: 420px :height: 420px .. code:: r ggplot(data = datos, aes(x = sexo, y = años_experiencia)) + geom_boxplot() + labs(title = "Ofertas laborales", subtitle = "Años de experiencia y sexo", x = "Sexo", y = "Años de experiencia") .. image:: output_72_0.png :width: 420px :height: 420px Distribución del salario por cada sexo. .. code:: r ggplot(data = datos, aes(x = sexo, y = salario_honorarios)) + geom_boxplot() + labs(title = "Ofertas laborales", subtitle = "Salario y sexo", x = "Sexo", y = "Salario") .. image:: output_74_0.png :width: 420px :height: 420px Distribución del salario por cada nivel educativo. .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios)) + geom_boxplot() + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo", x = "Nivel educativo", y = "Salario") .. image:: output_76_0.png :width: 420px :height: 420px Gráfico Boxplot con observaciones individuales como puntos. Se agrega la capa de ``geom_point()`` .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios)) + geom_boxplot() + geom_point() + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo", x = "Nivel educativo", y = "Salario") .. image:: output_78_0.png :width: 420px :height: 420px Gráfico Boxplot con observaciones individuales como puntos y clasificación de los puntos por una variable. En la capa de ``geom_point`` se agrega ``aes(color = sexo)``. .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios)) + geom_boxplot() + geom_point(aes(color = sexo)) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo", x = "Nivel educativo", y = "Salario") .. image:: output_80_0.png :width: 420px :height: 420px Distribución del salario por cada cargo. .. code:: r ggplot(data = datos, aes(x = cargo, y = salario_honorarios)) + geom_boxplot() + labs(title = "Ofertas laborales", subtitle = "Salario y cargo", x = "Cargo", y = "Salario") + coord_flip() .. image:: output_82_0.png :width: 420px :height: 420px Distribución del salario por nivel de educación e idioma adicional requerido. .. code:: r ggplot(data = datos, aes(x = nivel_educativo, y = salario_honorarios)) + geom_boxplot() + facet_grid(. ~ idiomas) + labs(title = "Ofertas laborales", subtitle = "Salario y nivel educativo por idioma", x = "Nivel educativo", y = "Salario") .. image:: output_84_0.png :width: 420px :height: 420px El siguiente gráfico tiene las variables anteriores, pero con diferente orden en la clasificación. .. code:: r ggplot(data = datos, aes(x = idiomas, y = salario_honorarios)) + geom_boxplot() + facet_grid(. ~ nivel_educativo) + labs(title = "Ofertas laborales", subtitle = "Salario e idioma por nivel educativo", x = "Idiomas", y = "Salario") .. image:: output_86_0.png :width: 420px :height: 420px Distribución del salario por idioma adicional requerido y adicionalmente, por nivel educativo y años de experiencia. .. code:: r ggplot(data = datos, aes(x = idiomas, y = salario_honorarios)) + geom_boxplot() + facet_grid(vacantes ~ nivel_educativo) + labs(title = "Ofertas laborales", subtitle = "Salario e idioma por nivel educativo y años de experiencia", x = "Idiomas", y = "Salario") .. image:: output_88_0.png :width: 420px :height: 420px